8장. 재료 고르기 — 좋은 데이터 모으기
출처: 『AI 엔지니어링』(Chip Huyen 지음, 한국어판) | 원서 8장 대응
코드는 분위기만 — Python·import 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.
모델을 우리 일에 맞게 다듬으려면(파인튜닝) 가르칠 자료가 필요하다.
그 자료가 바로 데이터다.
이 장은 "어떤 데이터를 모으고, 어떻게 고르고, 어떻게 깨끗이 손질하는가" 만 다룬다.
요리로 치면 재료 고르기다.
0. 이 장의 새 단어 (0장에 없는 것만)
0장 용어집에 없는 말은 딱 세 개다.
나머지 어려운 말(파인튜닝·추론·환각 등)은 전부 0장에 있다. 막히면 0장으로 돌아가면 된다.
데이터 품질(data quality)
한 문장 뜻 — 모은 자료가 얼마나 깨끗하고 쓸 만한지의 정도.
일상비유 — 재료의 신선도. 같은 김치찌개라도 묵은 재료로 끓이면 맛이 없다. 자료도 신선해야 모델이 잘 배운다.
한 줄 예 —
# 같은 100개라도 깨끗한 100개가 더럽게 섞인 1000개보다 낫다
good = clean_examples[:100] # 신선한 재료 100개
합성 데이터(synthetic data)
한 문장 뜻 — 진짜로 모은 게 아니라, 프로그램이나 AI가 만들어 낸 가짜 자료.
일상비유 — 모형 과일. 진짜 사과가 부족할 때 진짜처럼 생긴 모형을 더 만들어 진열대를 채우는 것. 진짜와 잘 섞어 써야 한다.
한 줄 예 —
# 진짜 자료가 모자라서 AI에게 비슷한 걸 더 만들게 시킴
fake = model.make_examples(how_many=500) # 가짜로 500개 보충
중복 제거(deduplication)
한 문장 뜻 — 똑같은 자료가 여러 번 들어가 있으면 한 개만 남기고 지우는 일.
일상비유 — 사진첩 정리. 같은 사진이 50장 있으면 1장만 남긴다. 안 그러면 그 사진만 외운 사람이 된다.
한 줄 예 —
# 같은 예시가 여러 번 있으면 하나만 남김
unique = remove_duplicates(all_data) # 중복 빼고 고유한 것만
(귀납 도입) 이런 적 있죠?
모델을 우리 회사 말투에 맞게 다듬으려고 데이터를 잔뜩 긁어모았다.
인터넷에서 100만 개를 모았으니 많을수록 좋겠지 싶었다.
그런데 다듬은 모델이 더 이상해졌다.
긁어온 자료에 광고 문구, 깨진 글자, 똑같은 문장이 수백 번 섞여 있었던 것이다.
# 무작정 많이 모은 데이터
data = scrape_web(count=1_000_000)
my_model = finetune(base_model, data) # 결과: 더 나빠짐
옆 팀은 달랐다.
딱 1,000개만 골랐다.
대신 하나하나 깨끗하고, 우리 일과 딱 맞는 것만 손으로 골랐다.
그 1,000개로 다듬은 모델이 100만 개로 다듬은 우리 것보다 훨씬 잘했다.
그게 데이터 품질이다.
데이터 품질은 모은 자료가 얼마나 깨끗하고 우리 일과 잘 맞는지의 정도다.
세계 최고의 팀이라도 좋은 자료가 없으면 좋은 모델을 못 만든다.
양보다 질이다.
이 장에서 딱 3가지만
- 양보다 질이다. 깨끗한 1,000개가 더러운 100만 개를 이긴다. (데이터 품질)
- 모자라면 만들어 채운다. 진짜 자료가 부족할 때 AI로 가짜를 더 만들되, 진짜와 섞어 쓴다. (합성 데이터)
- 쓰기 전에 손질한다. 중복을 지우고, 더러운 것을 닦아낸다. (중복 제거)
학습 목표
이 장을 끝내면 다음을 할 수 있다.
- 데이터는 양보다 질이 중요함을 설명한다.
- 좋은 데이터의 조건을 구분한다.
- 합성 데이터가 왜 필요한지 설명한다.
- 데이터를 손질하는 순서를 구분한다.
개념 1 — 양보다 질 (데이터 품질)
망가지는 장면
자료가 많을수록 좋은 줄 알고 인터넷에서 닥치는 대로 긁어 왔다.
그 안에 광고, 깨진 글자, 우리 일과 상관없는 옛날 문서가 잔뜩 섞여 있었다.
모델은 그 쓰레기까지 그대로 배웠다.
일상비유
재료의 신선도다.
같은 찌개라도 묵은 재료 한 트럭보다, 신선한 재료 한 바구니가 더 맛있는 요리를 만든다.
자료도 양이 아니라 신선도(품질)가 맛을 정한다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 신선한 재료 한 바구니 | finetune(model, clean_1000) |
안전 — 적어도 깨끗해서 잘 배움 |
| 묵은 재료 한 트럭 | finetune(model, dirty_1000000) |
쓰레기까지 배움 — 모델이 더 나빠짐 |
한 문장 정의 — 데이터 품질은 모은 자료가 얼마나 깨끗하고 우리 일과 잘 맞는지의 정도이며, 모델 성능은 자료의 양이 아니라 이 품질이 정한다.
좋은 데이터의 조건 (쉽게 6가지)
- 우리 일과 관련 있나 — 현재 회사 규정을 묻는데 19세기 법률 문서로 가르치면 안 된다.
- 시킨 모양과 맞나 — 짧게 답하길 원하는데 길고 장황한 답으로 가르치면 안 된다.
- 서로 안 엇갈리나 — 같은 질문에 답이 제각각이면 모델이 헷갈린다.
- 깨끗한 모양인가 — 깨진 글자, 쓸데없는 꼬리표 기호가 없어야 한다.
- 겹치지 않나 — 같은 게 수백 번 있으면 그것만 외운 모델이 된다.
- 민감 정보 없나 — 남의 주민번호 같은 개인 정보가 섞이면 안 된다.
예시 폭격 — 데이터 품질
예시 ① (worked-example, 완성예)
회사 챗봇을 다듬으려 한다.
잘못된 예 vs 올바른 예를 나란히 본다.
# 잘못된 예 — 양만 보고 긁어옴
data = scrape_web(count=500_000) # 광고·깨진 글자·옛날 문서 범벅
# → 모델이 광고 말투를 배워 버림
# 올바른 예 — 우리 일과 맞는 것만 골라 손으로 다듬음
data = pick_relevant(our_chat_logs)[:1000] # 깨끗한 우리 대화 1000개
# → 우리 말투를 정확히 배움
신선한 1,000개가 묵은 50만 개를 이긴다.
예시 ② (부분완성, 빈칸 채우기)
아래 빈칸에 들어갈 말을 생각해 보자.
# 목표: 짧고 깔끔한 답을 하는 모델
# 좋은 데이터는 _______ 답으로 채워야 한다
data = [ex for ex in all_examples if len(ex.answer) < 50] # 빈칸: 짧은
빈칸은 "짧은" 이다.
시킨 모양(짧은 답)과 가르치는 자료의 모양이 같아야 하기 때문이다.
예시 ③ (독립적용)
상황: 의료 상담 챗봇용 자료 1만 개를 모았다.
그 안에 환자 이름과 전화번호가 그대로 들어 있다.
좋은 데이터 6조건 중 무엇을 어긴 걸까?
답: 6번 "민감 정보 없나" 를 어겼다.
개인 정보는 쓰기 전에 반드시 지워야 한다.
미니 시나리오 — 이럴 때 이렇게
"데이터가 5만 개나 있는데 모델이 안 좋아져요" → 양을 늘리기 전에, 먼저 5만 개 안에서 우리 일과 맞는 깨끗한 것만 골라낸다.
대개 양이 아니라 질이 문제다.
한 걸음 더 ▸ (지금 몰라도 됨)
"그럼 무조건 적게가 답인가요?" 는 아니다. 정말 어려운 일은 많은 자료가 필요하기도 하다.
지금은 "양부터 늘리지 말고, 질부터 챙긴다" 라는 규칙 하나만 들고 가면 된다. 균형 판단은 더 깊은 주제다.
개념 2 — 모자라면 만들어 채운다 (합성 데이터)
망가지는 장면
희귀병 진단 모델을 만들려는데, 그 병의 실제 사례가 50건뿐이었다.
진짜 자료가 턱없이 부족했다.
기다린다고 환자가 갑자기 늘어나는 것도 아니었다.
일상비유
모형 과일이다.
진짜 사과가 부족할 때, 진짜처럼 생긴 모형 사과를 더 만들어 진열대를 채운다.
자료가 부족하면 진짜처럼 생긴 가짜 자료를 만들어 채우는 게 합성 데이터다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 진짜+모형 섞어 진열 | data = real + synthetic |
안전 — 부족분을 채우면서 진짜도 유지 |
| 모형만 잔뜩 진열 | data = synthetic_only |
진짜 감각을 잃음 — 모델이 점점 멍청해짐 |
한 문장 정의 — 합성 데이터는 진짜로 모은 게 아니라 프로그램이나 AI가 만들어 낸 가짜 자료이며, 진짜 자료가 부족할 때 반드시 진짜와 섞어서 보충한다.
왜 만들어서 채우나 (쉽게 3가지)
- 양이 모자랄 때 — 희귀병, 드문 사고처럼 진짜를 구하기 어려운 경우.
- 민감해서 못 쓸 때 — 진짜 의료 기록 대신 비슷하게 지어낸 가짜로 대체.
- 일부러 어려운 걸 만들 때 — AI가 사람보다 더 까다로운 연습 문제를 만들어 줄 수 있다.
예시 폭격 — 합성 데이터
예시 ① (worked-example, 완성예)
진짜 영어 문장 하나를 가지고 가짜를 더 만든다.
번역을 두 번 돌리는 방법이다.
# 진짜 한 문장에서 비슷한 변형을 자동으로 만듦
original = "환불은 7일 안에 가능합니다"
mid = translate(original, to="영어") # 영어로
back = translate(mid, to="한국어") # 다시 한국어로 → 살짝 다른 문장
# original 과 back 둘 다 학습에 쓰면 자료가 2배
이렇게 하나에서 여럿을 불려 부족분을 채운다.
예시 ② (부분완성, 빈칸 채우기)
가짜만 쓰면 안 되고, 진짜와 섞어야 한다.
빈칸을 채워 보자.
real = load_real(count=200) # 진짜 200개
fake = model.make_examples(count=800) # 가짜 800개
data = real + ____ # 빈칸: fake (진짜와 섞기)
빈칸은 fake 다.
진짜(real) 만 쓰면 양이 모자라고, 가짜(fake) 만 쓰면 진짜 감각을 잃기 때문에 둘을 섞는다.
예시 ③ (독립적용)
상황: 고객 불만 응대 모델을 만드는데, 화난 고객 사례가 30건뿐이다.
가짜로 보충하려 한다. 어떻게 안전하게 할까?
답: AI에게 화난 고객 말투의 예시를 더 만들게 한 뒤, 진짜 30건과 섞어서 쓴다.
가짜만 쓰지 않는 것이 핵심이다.
미니 시나리오 — 이럴 때 이렇게
"진짜 자료가 너무 적어요" → AI나 번역으로 비슷한 가짜를 만들어 보충하되, 진짜와 꼭 섞는다.
가짜만 모아 가르치면 모델이 진짜 세상을 점점 잊는다.
한 걸음 더 ▸ (지금 몰라도 됨)
"가짜만으로 가르치면 왜 나빠지나요?" — 가짜를 또 가짜로 불리기를 반복하면 모델이 드문 경우를 점점 잊어버린다. 이걸 어렵게는 '모델 붕괴' 라 부른다.
지금은 "가짜는 보충용, 진짜와 섞는다" 만 기억하면 된다.
개념 3 — 쓰기 전에 손질한다 (중복 제거와 청소)
망가지는 장면
모은 자료를 그대로 모델에 넣었다.
알고 보니 인기 있는 문장 하나가 수백 번 똑같이 들어 있었다.
모델은 그 문장만 외운 사람처럼 굴었다.
일상비유
사진첩 정리다.
여행 사진을 정리하는데 똑같은 노을 사진이 50장 있다.
1장만 남기고 지운다.
자료도 같은 게 여러 번 있으면 하나만 남긴다. 이게 중복 제거다.
| 비유 | 코드 | 위험 |
|---|---|---|
| 같은 사진 1장만 남김 | data = remove_duplicates(raw) |
안전 — 골고루 배움 |
| 같은 사진 50장 그대로 둠 | data = raw |
그 한 장만 외움 — 균형이 무너짐 |
한 문장 정의 — 중복 제거는 똑같은 자료가 여러 번 들어가 있을 때 하나만 남기고 지우는 일이며, 자료를 모델에 넣기 전 손질의 핵심 단계다.
손질 순서 (쉽게 4단계)
- 직접 본다 — 먼저 자료를 눈으로 훑는다. 이상한 게 없나 직접 본다.
- 겹친 것 지운다 — 똑같은 자료는 하나만 남긴다 (중복 제거).
- 더러운 것 닦는다 — 깨진 글자, 광고, 개인 정보를 지운다.
- 모양 맞춘다 — 가르칠 때 모양과 실제로 쓸 때 모양을 똑같이 맞춘다.
예시 폭격 — 손질
예시 ① (worked-example, 완성예)
자료를 넣기 전에 손질하는 흐름이다.
raw = load_all() # 1. 모은 자료
look_at(raw[:20]) # 먼저 눈으로 훑기
data = remove_duplicates(raw) # 2. 겹친 것 지우기
data = remove_ads_and_pii(data) # 3. 광고·개인정보 닦기
data = fix_format(data) # 4. 모양 맞추기
이 순서대로 손질한 자료만 모델에 넣는다.
예시 ② (부분완성, 빈칸 채우기)
손질에는 효율적인 순서가 있다.
빈칸을 채워 보자.
# 더러운 것을 먼저 버리면 지울 양이 줄어 빠르다
data = remove_dirty(raw) # 먼저 더러운 것 버리기
data = ______(data) # 빈칸: remove_duplicates (그다음 중복 제거)
빈칸은 remove_duplicates 다.
더러운 것을 먼저 버려 양을 줄인 뒤 중복을 지우면 더 빠르기 때문이다.
예시 ③ (독립적용)
상황: 학습 자료에서 모델이 광고 문구를 자꾸 따라 한다.
손질 4단계 중 무엇을 빠뜨린 걸까?
답: 3단계 "더러운 것 닦기" 를 빠뜨렸다.
광고 같은 군더더기를 미리 지워야 한다.
before / after — 모양 맞추기
가르칠 때 모양과 쓸 때 모양이 다르면 모델이 헷갈린다.
# before — 모양이 어긋남
# 가르칠 때: "버거 -->" / 실제로 쓸 때: "버거"
# → 모델이 끝의 화살표를 못 찾아 이상하게 답함
# after — 모양을 똑같이 맞춤
# 가르칠 때도 "버거 -->" / 쓸 때도 "버거 -->"
# → 모델이 헷갈리지 않음
미니 시나리오 — 이럴 때 이렇게
"자료를 넣었는데 모델이 한 가지 답만 반복해요" → 같은 자료가 여러 번 들어갔는지 의심한다.
중복부터 지운다.
한 걸음 더 ▸ (지금 몰라도 됨)
자료가 수백만 개라 일일이 비교가 힘들면, 빠르게 겹침을 찾아내는 영리한 기법들이 있다.
지금은 "넣기 전에 직접 보고, 겹친 것 지우고, 더러운 것 닦는다" 순서만 기억하면 된다.
가장 단순한 행동 규칙
자료를 모을 때는 이 한 줄만 기억하면 된다.
양부터 늘리지 말고 → 깨끗한 것만 고르고 → 모자라면 가짜로 채우되 진짜와 섞고 → 넣기 전에 손질한다.
많이가 아니라 깨끗하게, 가 핵심이다.
정리
- 모델 성능은 자료의 양이 아니라 품질이 정한다. 깨끗한 1,000개가 더러운 100만 개를 이긴다.
- 진짜 자료가 부족하면 AI로 가짜를 만들어 채우되, 반드시 진짜와 섞는다.
- 모델에 넣기 전에 직접 보고, 겹친 것 지우고, 더러운 것을 닦는다.
다음 장 예고 — 다음 장에서는 다듬은 모델을 실제로 굴려 쓸 때 빠르고 싸게 굴리는 법을 본다. (지금 몰라도 됩니다 — 다음 장에서 풀려요.)
클릭하거나 Space를 눌러 뒤집기